
def patt_sub_only_capture_obj(patt: object, replace_str: str, old_str: str) -> str:
    """正则表达式sub替换仅限于捕捉内容的替换"""
    if not isinstance(replace_str, str):
        replace_str = str(replace_str)
    if patt.search(old_str):
        return patt.sub(lambda x:x.group(0).replace(x.group(1), replace_str), old_str)
    else:
        return old_str

def patt_sub_only_capture_obj_add(patt: object, add_str: str, old_str: str) -> str:
    """正则表达式sub替换仅限于捕捉内容，替换后内容为：<原捕捉内容> + add_str """
    if patt.search(old_str):
        return patt.sub(lambda x:x.group(0).replace(x.group(1), x.group(1)+add_str), old_str)
    else:
        return old_str

def patt_sub_only_capture_obj_obtain_double(patt: object, replace_str: str, old_str: str, double_str: str='[]') -> str:
    """多个两侧括号属性，包含括号在内进行替换"""
    replace_str = f'{double_str[0]}{replace_str}{double_str[-1]}'
    if patt.search(old_str):
        return patt.sub(lambda x:x.group(0).replace(double_str[0]+x.group(1)+double_str[-1], replace_str), old_str)
    else:
        return old_str

def patt_template_replace(patt: object, data: str, *args, **kwargs):
    """模板替换（不对模板中的所有替换点进行替换，只对传入的替换参数进行替换）
    
        对正则匹配的整体进行替换，捕捉值只是整个替换内容中的一部分。

        patt: 正则获取要替换的文本，正则表达式类型
        data: 原始字符串
        kwargs：主要的替换内容来自于这里
    """
    def deal(x):
        if x.group(1) in kwargs:
            return kwargs[x.group(1)]
        else:
            return x.group(0)
    if patt.search(data):
        return patt.sub(deal, data)
    else:
        return data

def patt_template_replace2(patt: object, data: str, *args, **kwargs):
    """模板替换（不对模板中的所有替换点进行替换，只对传入的替换参数进行替换）
    
        对正则匹配的整体进行替换，捕捉值只是整个替换内容中的一部分。
        【区别于 patt_template_replace ，patt_template_replace2 替换的是第二个捕捉值】
        【专门用于 路由 的 参数替换。如：<int:age>】
    """
    def deal(x):
        if x.group(2) in kwargs:
            return kwargs[x.group(2)]
        else:
            return x.group(0)
    if patt.search(data):
        return patt.sub(deal, data)
    else:
        return data
